// medicalInsuranceAPI.js
import request from '@/untils/request' // 假设使用项目中的request库

/**
 * 医保接口公共调用方法
 * @param {String} infNo 交易编号，如'3502'
 * @param {Object} inputData 交易输入数据
 * @param {String} infVersion 接口版本号，默认为文档中的V1.1.83
 * @returns {Promise} 返回Promise对象
 */
export const callMedicalInsuranceAPI = (infNo, inputData, infVersion = 'V1') => {
  // 获取当前定点医药机构信息（这些信息应该从您的系统配置中获取）
  const fixmedinsCode = localStorage.getItem('medicalInsurance_fixmedinsCode') || '机构编号'
  const fixmedinsName = localStorage.getItem('medicalInsurance_fixmedinsName') || '机构名称'
  
  // 生成报文ID（按照文档要求：定点医药机构编号(12)+时间(14)+顺序号(4)）
  const timestamp = new Date().toISOString().replace(/[-:T.Z]/g, '').slice(0, 14)
  const sequence = Math.floor(Math.random() * 10000).toString().padStart(4, '0')
  const msgid = `${fixmedinsCode}${timestamp}${sequence}`
  
  // 构建请求参数（根据文档第4章接口报文格式）
  const requestData = {
    infno: infNo, // 交易编号
    msgid: msgid, // 发送方报文ID
    mdtrtarea_admvs: inputData.mdtrtarea_admvs || '', // 就医地医保区划
    insuplc_admdvs: inputData.insuplc_admdvs || '', // 参保地医保区划
    recer_sys_code: '默认系统代码', // 接收方系统代码
    dev_no: '', // 设备编号
    dev_safe_info: '', // 设备安全信息
    cainfo: '', // 数字签名信息（需要按照文档要求生成）
    signtype: 'SM2', // 签名类型
    infver: infVersion, // 接口版本号
    opter_type: '1', // 经办人类别：1-经办人
    opter: JSON.parse(localStorage.getItem('userInfo')).userId, // 经办人/终端编号
    opter_name: JSON.parse(localStorage.getItem('userInfo')).userName, // 经办人姓名/终端名称
    inf_time: new Date().toISOString().replace('T', ' ').substring(0, 19), // 交易时间
    fixmedins_code: fixmedinsCode, // 定点医药机构编号
    fixmedins_name: fixmedinsName, // 定点医药机构名称
    sign_no: localStorage.getItem('medicalInsurance_signNo') || '', // 交易签到流水号（通过签到交易获取）
    app_id: '您的渠道ID',
    enc_type: '', // 加密方式，不加密传空
    input: JSON.stringify({
      data: inputData // 交易输入数据，根据具体接口要求构建
    })
  }
  
  // 注意：实际使用时需要按照文档要求进行数字签名
  // 这里简化处理，实际项目需要实现签名逻辑
  
  return request({
    url: '/yb-api/eapdomain/callService', // 您的医保接口地址
    method: 'post',
    data: requestData,
    headers: {
      'Content-Type': 'application/json;charset=UTF-8'
    }
  })
}

/**
 * 专门用于3502库存变化接口的方法
 * @param {Array} inventoryChanges 库存变化数据数组
 * @param {String} changeType 变更类型（108-111等，见文档）
 * @returns {Promise} 返回Promise对象
 */
export const call3502InventoryChange = (inventoryChanges, changeType) => {
  // 构建3502接口要求的输入数据格式（根据文档5.3.5.2章节）
  const inputData = {
    fixmedins_code: localStorage.getItem('medicalInsurance_fixmedinsCode'),
    med_list_codg: '', // 医疗目录编码（文档说明为非必填）
    change_type: changeType, // 库存变更类型
    change_time: new Date().toISOString().replace('T', ' ').substring(0, 19),
    details: inventoryChanges.map(item => ({
      medins_list_codg: item.drugCode, // 医药机构目录编码
      drug_name: item.drugName, // 药品名称
      drug_spec: item.drugSpec, // 药品规格
      change_cnt: item.purcCnt, // 变更数量（正数表示增加，负数表示减少）
      change_unt: item.pacUnt, // 变更单位
      manu_lotnum: item.manuLotnum, // 生产批号
      prodentp_name: item.prodentpName, // 生产厂家
      purc_pric: item.purcPric, // 成本单价
      sale_pric: item.salePric, // 零售单价
      trac_codg: item.tracCodg || '', // 追溯码（如果有）
      trdn_flag: item.trdnFlag || '0' // 拆零标志：0-否，1-是
    }))
  }
  
  return callMedicalInsuranceAPI('3502', inputData)
}